package persistence;

import java.util.ArrayList;
import java.util.List;

import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;

import junit.framework.TestCase;

import org.junit.Test;

import br.com.linhadotempo.util.Cifras;
import br.com.taimlain.modelo.Auth;
import br.com.taimlain.modelo.Fato;
import br.com.taimlain.modelo.Linha;
import br.com.taimlain.modelo.Usuario;

public class testPersistence extends TestCase {

	private static EntityManagerFactory factory;
	private static EntityManager em;
	private static Usuario john = new Usuario();
	private static Auth auth = new Auth();
	private static Fato fato = new Fato();
	private static Linha linha = new Linha();
	private static List<Usuario> lista = new ArrayList<Usuario>();

	@Override
	protected void setUp() throws Exception {
		
		factory = Persistence.createEntityManagerFactory("taimlainPU");
		em = factory.createEntityManager();
		
		john.setNome("John von Neumann");
		john.setDataNasc("28/12/1903");
		john.setEmail("john@gmail.com");
		
		auth.setUsername(Cifras.criptografarEssa("johnvonneumann"));
		auth.setPassword(Cifras.criptografarEssa("johnvonneumann"));
		auth.setUsuario(john);
		
		fato.setDescricao("A distincao de von (Margittai, em Hungaro) entra na familia");
		fato.setQuando("01/01/1913");
		fato.setUsuario(john);
		
		linha.setDescricao("Vida de John");
		linha.setQuandoInicio("28/12/1903");
		linha.setQuandoFim("08/02/1957");
		linha.setUsuario(john);
		
		super.setUp();
	}

	@SuppressWarnings("unchecked")
	@Test
	public void testPersistUsuario() {

		em.getTransaction().begin();
		em.persist(john);
		em.persist(auth);
		em.persist(fato);
		em.persist(linha);
		em.getTransaction().commit();

		String sql = "FROM Usuario WHERE nome = ?1";

		lista = em.createQuery(sql).setParameter(1, john.getNome()).getResultList();

		assertEquals(1, lista.size());
	}

	@SuppressWarnings("unchecked")
	@Test
	public void testGetUsuario() {

		String sql = "FROM Usuario WHERE nome = ?)";

		lista.clear();
		lista = em.createQuery(sql).setParameter(1, john.getNome()).getResultList();

		john = (Usuario) lista.get(0);
		//fato = (Fato) john.getFatos().get(0);
		linha = (Linha) john.getLinhas().get(0);

		assertEquals(1, lista.size());
		//assertEquals(1, john.getFatos().size());
		assertEquals(1, john.getLinhas().size());
	}

	@SuppressWarnings("unchecked")
	@Test
	public void testMergeUsuario() {

		john.setEmail("john_von_neumann@matematicohungaro.com");
		fato.setDescricao("A distincao de von entra na familia");
		linha.setDescricao("Vida de John von Neumann");

		em.getTransaction().begin();
		em.merge(john);
		em.merge(fato);
		em.merge(linha);
		em.getTransaction().commit();

		String sql = "FROM Usuario WHERE email = ?1";

		lista.clear();
		lista = em.createQuery(sql).setParameter(1, john.getEmail()).getResultList();

		assertEquals(1, lista.size());
		//assertEquals("A distincao de von entra na familia", john.getFatos().get(0).getDescricao());
		assertEquals("Vida de John von Neumann", john.getLinhas().get(0).getDescricao());
	}

	@SuppressWarnings("unchecked")
	@Test
	public void testRemoveUsuario(){
		
		em.getTransaction().begin();
		em.remove(em.find(Usuario.class, john.getId()));
		em.getTransaction().commit();
		
		String sql = "FROM Usuario WHERE id = ?1";

		lista.clear();
		lista = em.createQuery(sql).setParameter(1, john.getId()).getResultList();

		assertEquals(0, lista.size());
	}

	@Override
	protected void tearDown() throws Exception {
		
		em.close();
		factory.close();
		
		super.tearDown();
	}
}
